﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;


//class A
//{
//public:
//	void f() { cout << "A::f()" << endl; }
//	int a;
//};
//
//
//class B : public A
//{
//public:
//	void f() { cout << "B::f()" << endl; }
//	int a;
//
//};
//
//
//
//int main()
//{
//	B b;
//	b.f();
//	return 0;
//}


//class A
//{
//public:
//	A() { cout << "A::A()" << endl; }
//	~A() { cout << "A::~A()" << endl; }
//	int a;
//};
//
//class B : public  A
//{
//public:
//	B() { cout << "B::B()" << endl; }
//	~B() { cout << "B::~B()" << endl; }
//	int b;
//};
//int main()
//{
//	B b;
//}

//class Base1 { public: int _b1; };
//class Base2 { public: int _b2; };
//class Derive : public Base1, public Base2
//{
//public: int _d;
//};
//
//int main() {
//Derive d;
//
//Base1* p1 = &d;
//Base2* p2 = &d;
//Derive* p3 = &d;
//
//cout << sizeof(p1) << endl;
//cout << sizeof(p2) << endl;
//cout << sizeof(p3) << endl;
//
//return 0;
//}

//class car
//{
//public:
//	virtual void Drive() = 0;
//	
//};
//
//class Benz:public car
//{
//public:
//	virtual void Drive()
//	{
//		cout << "Benz-舒适" << endl;
//	}
//};
//
//class BMW :public car
//{
//public:
//	virtual void Drive()
//	{
//		cout << "BMW-操控" << endl;
//	}
//};
//
//int main()
//{
//	Benz b;
//
//	car* p = new Benz;
//	p->Drive();
//
//	p = new BMW;
//	p->Drive();
//
//	return 0;
//}

//class Base
//{
//public:
//	Base()
//		:_b(2)
//	{
//		//cout << "Base()" << endl;
//	}
//
//	virtual void Func1()
//	{
//		cout << "Base::Func1()" << endl;
//	}
//
//	virtual void Func2()
//	{
//		cout << "Base::Func2()" << endl;
//	}
//
//	void Func3()
//	{
//		cout << "Base::Func3()" << endl;
//	}
//private:
//	int _b = 1;
//};
//
//class Derive : public Base
//{
//public:
//	virtual void Func1()
//	{
//		cout << "Derive::Func1()" << endl;
//	}
//
//	virtual void Func3()
//	{
//		cout << "Derive::Func3()" << endl;
//	}
//private:
//	int _d = 2;
//};
//
////typedef void(*ptr)();
////
////void Printfvft(ptr* vft)
////{
////	for (size_t i = 0;vft[i] != nullptr ;i++)
////	{
////		printf("[%d]:%p->",i,vft[i]);
////		ptr f = vft[i];
////		f();
////	}
////};
////
////int main()
////{
////	Derive p;
////	Printfvft((ptr*)(*((int*)&p)));
////	return 0;
////}
//
//typedef void(*VF_PTR)();
//
//// 打印虚表，本质打印指针(虚函数指针)数组
////void PrintVFT(VF_PTR vft[], int n)
////void PrintVFT(VF_PTR vft[])
//void PrintVFT(VF_PTR* vft)
//{
//	for (size_t i = 0; vft[i] != nullptr; i++)
//	{
//		printf("[%d]:%p->", i, vft[i]);
//
//		VF_PTR f = vft[i];
//		f();
//		//(*f)();
//	}
//	cout << endl << endl;
//}
//
//int main()
//{
//	Derive d;
//
//	PrintVFT((VF_PTR*)(*((int*)&d)));
//
//	return 0;
//}

class Base
{
public:
	virtual void Func1()
	{
		cout << "Base::Func1()" << endl;
	}

	virtual void Func2()
	{
		cout << "Base::Func2()" << endl;
	}

	void Func3()
	{
		cout << "Base::Func3()" << endl;
	}
private:
	int _b = 1;
};

class Derive : public Base
{
public:
	virtual void Func1()
	{
		cout << "Derive::Func1()" << endl;
	}

	virtual void Func3()
	{
		cout << "Derive::Func3()" << endl;
	}
private:
	int _d = 2;
};
//
typedef void(*VF_PTR)();

// 打印虚表，本质打印指针(虚函数指针)数组
//void PrintVFT(VF_PTR vft[], int n)
//void PrintVFT(VF_PTR vft[])
void PrintVFT(VF_PTR* vft)
{
	for (size_t i = 0; vft[i] != nullptr; i++)
	{
		printf("[%d]:%p->", i, vft[i]);

		VF_PTR f = vft[i];
		f();
		//(*f)();
	}
	cout << endl << endl;
}

int main()
{
	Derive d;

	PrintVFT((VF_PTR*)(*((int*)&d)));

	return 0;
}